
#include "FileStream.h"
#include "TEString.h"

//
// Constructor
//

FileStream::FileStream(bool _read)
{
	read = _read;
}

//
// Open
//

void FileStream::Open(const string &fileName, bool _binary, const string &_delim)
{
	binary = _binary;
	delim = _delim;

	if(read) iFile.open(fileName.c_str(), ifstream::in  | (binary ? ifstream::binary : 0));
	else     oFile.open(fileName.c_str(), ofstream::out | (binary ? ofstream::binary : 0));

	tokens.clear();
	tokI = 0;
}

//
// Close
//

void FileStream::Close()
{
	if(read) iFile.close();
	else     oFile.close();
}

//
// IsOpen
//

bool FileStream::IsOpen()
{
	if(read) return iFile.is_open();
	else     return oFile.is_open();
}

//
// IsGood
//

bool FileStream::IsGood()
{
	if(read) return iFile.good();
	else     return oFile.good();
}

//
// Read
//

void FileStream::Read(char *ptr, ulong size)
{
	if(read) iFile.read(ptr, size);
}

//
// Write
//

void FileStream::Write(char *ptr, ulong size)
{
	if(!read) oFile.write(ptr, size);
}

//
// GetString
//

string FileStream::GetString()
{
	if(read)
	{
		while(tokI >= tokens.size() && iFile.good())
		{
			tokens.clear();
			tokI = 0;

			string line;
			getline(iFile, line);
			Tokenize(line, tokens, delim);
		}

		if(iFile.good())
			return tokens[tokI];

		return "";
	}

	return "";
}

//
// WriteFlag
//

void FileStream::WriteFlag(bool flag)
{
	if(!read)
	{
		if(flag) oFile << (uchar)1;
		else     oFile << (uchar)0;
	}
}

//
// ReadFlag
//

bool FileStream::ReadFlag()
{
	uchar flag = 0;
	if(read) iFile >> flag;

	return flag != 0;
}